package com.xbongbong.saas.model;

import com.xbongbong.paas.field.ItemPoJo;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.pro.dictionary.pojo.dto.DictionaryListDTO;
import com.xbongbong.pro.dictionary.pojo.vo.DictionaryVO;
import com.xbongbong.saas.domain.entity.DataDictionaryEntity;
import com.xbongbong.saas.enums.dictionary.DictionaryEnum;

import java.util.List;
import java.util.Map;

/**
 * @author haibin.zhang
 * @version v1.0
 * @date 2019/1/31 9:04
 * @since v1.0
 */
public interface DataDictionaryModel extends IModel<DataDictionaryEntity> {
    /**
     * 根据type获取数据字典
     * @param type 字典类型
     * @param corpid 公司id
     * @return 数据字典
     */
    DataDictionaryEntity getByType(Integer type, String corpid);

    /**
     * 更新数据字典
     * @param id 主键id
     * @param corpid 公司id
     * @param data 数据字典
     * @return 成功
     */
    Integer update(Long id, String corpid, String data);

    /**
     * 获取默认数据字典
     * @param type 类型
     * @return 默认数据字典
     */
    DataDictionaryEntity getDefaultByType(Integer type);

    /**
     * 获取数据字典
     * @param id
     * @param corpid
     * @return
     */
    DataDictionaryEntity getByKey(Long id, String corpid);

    //------------以下方法从DictionaryService内移入，其他项目要用到的底层数据字典方法降到model层
    /**
     * 获取数据字典列表
     * @param dictionaryListDTO 参数
     * @return 数据字典列表
     * @throws XbbException XbbException
     */
    DictionaryVO list(DictionaryListDTO dictionaryListDTO) throws XbbException;
    /**
     * 获取数据字典列表（只获取启用的，且不限制addtionnalField）
     * 业务场景使用
     * @param dictionaryEnum 数据字典类型
     * @param corpid 公司id
     * @param formId 表单id，不需要时传null
     * @return 数据字典列表
     * @throws XbbException XbbException
     */
    List<ItemPoJo> getArrayList(DictionaryEnum dictionaryEnum, String corpid, Long formId) throws XbbException;

    /**
     * 通过数据字典的key值获取value
     *
     * @param corpid            公司id
     * @param dictionaryEnum    数据字典类型{@link DictionaryEnum}
     * @param key               数据字典的key值
     * @author GuoJun.HU
     * @since V1.0
     * @return String
     * @date 2019/3/13 15:40
     * @throws XbbException XbbException
     */
    String getDictionaryValue(String corpid, DictionaryEnum dictionaryEnum, Object key) throws XbbException ;

    /**
     * 获取表单内字段的下拉选项
     *
     * @param saasAttr 原saas业务名或pro的字段名,保险点用枚举获取,防止找错。即相应业务的枚举字段，如CustomerManagementEnum的attr或saasAttr
     * @param corpid 公司id
     * @param formId 表单id
     * @return map
     */
    List<ItemPoJo> getDictionaryList4Attr(String saasAttr, String corpid, Long formId) throws XbbException;

    /**
     * 获取原saas内所有的数据字典（根据类型的不同会路由到不同方法去获取字典项：数据字典表or表单下拉选项）
     * @param dictionaryEnum 数据字典枚举
     * @param corpid 公司id
     * @param formId 表单id，公司级别的非必传，如客户状态、合同状态无需传该值；表单级别和下拉类型字段则必传
     * @return java.util.List<ItemPoJo>
     * @throws XbbException
     * @author zcp
     * @date 2019/3/5 19:54
     * @since v1.0
     * @version v1.0
     */
    List<ItemPoJo> getDictionaryList4Saas(DictionaryEnum dictionaryEnum, String corpid, Long formId) throws XbbException;

    /**
     * 获取自定义数据字典中要统计的code集合（启用且addtionnalField=1）
     * @param dictionaryEnum 数据字典类型
     * @param corpid 公司id
     * @param formId 表单id，不需要时传null
     * @return java.util.List<java.lang.String> 数据字典列表
     * @throws XbbException
     * @author zcp
     * @date 2019/2/24 10:03
     * @since v1.0
     * @version v1.0
     */
    List<String> statisticTypeList(DictionaryEnum dictionaryEnum, String corpid, Long formId) throws XbbException;

    /**
     * 获取数据字典map
     * 此方法只获取出公司级别和表单级别，并不能获取出字段级别的（即附属到字段上的下拉型不可通过此方法获取）
     * 如果想获取下拉字段的，可通过getDictionaryList4Attr()方法
     * @param dictionaryEnum 数据字典类型
     * @param corpid 公司id
     * @param formId 表单id，不需要时传null
     * @return
     * @throws XbbException
     */
    Map<String,String> getDictionaryMap(DictionaryEnum dictionaryEnum, String corpid, Long formId) throws XbbException;

    /**
     * 获取原saas内数据字典list，并构建字典code和字典值的对应关系
     * @param dictionaryEnum 数据字典枚举
     * @param corpid 公司id
     * @param formId 表单id，公司级别的非必传，如客户状态、合同状态无需传该值；表单级别和下拉类型字段则必传
     * @return java.util.Map<java.lang.String,java.lang.String>
     * @throws XbbException
     * @author zcp
     * @date 2019/5/2 20:41
     * @since v1.0
     * @version v1.0
     */
    Map<String, String> getDictionaryMap4Saas(DictionaryEnum dictionaryEnum, String corpid, Long formId) throws XbbException;

    /**
     * 数据字典刷数据
     * @param corpid
     * @param updateMap
     */
    void updateBatch(String corpid, Map<Long, String> updateMap);

    void removeRedis(String corpid, Integer type);

    void insertBatch(List<DataDictionaryEntity> list);

    /**
     * 根据预收款菜单是否开启，获取回款单类型
     * 当预收款菜单关闭时，预收款相关类型隐藏
     * @param prepaymentMenuFlag
     * @return java.util.List<ItemPoJo>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<ItemPoJo> getDictionaryList4PaymentSheetType(boolean prepaymentMenuFlag);

    /**
     * 根据预付款菜单是否开启，获取付款单类型
     * 当预付款菜单关闭时，预付款相关类型隐藏
     * @param prepayMenuFlag
     * @return java.util.List<ItemPoJo>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<ItemPoJo> getDictionaryList4PaySheetType(boolean prepayMenuFlag);

    /**
     * 获取其他收入单类型
     * @return java.util.List<ItemPoJo>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<ItemPoJo> getDictionaryList4OtherIncomeSheetType();

    /**
     * 获取其他支出单类型
     * @return java.util.List<ItemPoJo>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<ItemPoJo> getDictionaryList4OtherExpenseSheetType();

    @Override
    List<DataDictionaryEntity> findEntitys(Map<String, Object> param);

    void updateBatchText(List<DataDictionaryEntity> dataDictionaryEntityList, String corpid);
}
